<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://203.162.17.98/weblh/suutam/2002/vovisoft/msnet/8.htm -->
<HTML><HEAD><TITLE>Bài 8</TITLE>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="Le Hoan" name=Author>
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="computer, software, games, vietnam, viet nam, tin hoc, le hoan, pclehoan, ktlehoan, vietnamese, download, saigon, freeware, lehoanpc, mailing list, may tinh, phan cung, phan mem, kien thuc, hop thu, internet, weblh, unicode, Forum, chat, diendan, dien dan" 
name=keywords>
<META 
content="Pho bien kien thuc, huong dan su dung phan cung, phan mem may tinh, game. Download software free. Link website Vietnam, forum, chat, mailing list..." 
name=description></HEAD>
<BODY>
<CENTER>
<P><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="8_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma></P>
<H2><FONT face=Tahoma color=#800000>Bài 8</FONT></H2>
<H2><FONT face=Tahoma color=#800000>Những chức năng mới trong giao diện cửa sổ 
của VB.NET (phần I)</FONT></H2></CENTER></FONT><FONT face=Arial>
<BLOCKQUOTE>
  <BLOCKQUOTE>
    <P align=justify><FONT size=2>Xin nhắc lại là .NET Framework cho ta ba cách 
    để user giao diện với chương trình áp dụng, đó là Windows Forms (có khi được 
    gọi tắt là WinForms), Web Forms và Console applications. Lần lượt chúng ta 
    sẽ học qua cả ba thứ nầy.<BR><BR>Ngoài ra, kể từ đầu tháng hai 2002, <B>thầy 
    Vũ Năng Hiền</B> sẽ viết một loạt bài riêng về <B>ASP.NET</B>. ASP.NET là 
    hậu thân của ASP (Active Server Pages), cái framework để ta lập trình trên 
    Webserver. Microsoft dùng ASP để thay thế <B>cgi-Perl (Common Gateway 
    Interface - Practical Extraction and Report Language)</B>, một ngôn ngữ lập 
    trình rất thịnh hành trên các Unix-based Webserver. Sau nầy chính Microsoft 
    mướn người ta port Perl qua WindowsNT.<BR><BR>Một chương trình ASP gồm có 
    nhiều trang giống như trang Web (HTML) nhưng bên trong có những mảnh chương 
    trình viết bằng VBScript hay JavaScript (thật ra script nào cũng được, kể cả 
    PerlScript) nằm ở nhiều nơi. Các mảnh Script nầy có thể truy cập cơ sở dữ 
    liệu để sửa đổi hay lấy dữ kiện ra để hiển thị tại chỗ ấy (nơi mảnh Script 
    nằm trong trang ASP) để tạo trang Web kết quả.<BR><BR>Trong ASP.NET, tất cả 
    các mảnh chương trình Script ấy được lấy ra riêng, để chung với nhau và được 
    viết lại dưới dạng ngôn ngữ thuần túy VB.NET hay C#. Phần coding đó được gọi 
    là <B>code behind</B> (code nằm phía sau) và rất giống như các Event 
    Handling Sub ta viết trong VB.NET cho Windows Forms.<BR><BR>Trong tương lai, 
    khi bàn đến Web Forms ta chỉ học tổng quát về ASP.NET và nhất là chỉ dùng 
    VB.NET trong các chương trình đơn giản. </FONT></P>
    <H3 align=justify><FONT color=green size=2>Sự quan trọng của Windows Forms 
    ?</FONT></H3>
    <P align=justify><FONT size=2>Windows Forms là cách hiển thị màn ảnh tối tân 
    hơn Win32 bình thường. Kỹ thuật nằm phía sau Windows Forms trước đây được 
    phát triển cho Windows Foundation Classes (WFC), để dùng trong Visual J++. 
    Điều nầy cắt nghĩa sự già dặn và vững chải của một sản phẩm hãy còn ở tình 
    trạng Beta.<BR><BR>Khi ta nghe nói đến .NET với những hứa hẹn về ứng dụng 
    trên Internet như Web Forms và Web Services, rất dễ cho ta tưởng rằng 
    Microsoft phải cung cấp Windows Forms là cực chẳng đã cho nó trọn vẹn món 
    hàng. Thật ra, Windows Forms là một phần của các base classes của .NET 
    Framework. Cái Namespace dùng cho nó là <B>System.Windows.Forms</B>, một 
    Namespace chứa rất nhiều thứ đến đổi hầu như chúng ta sẽ không cần phải dùng 
    trực tiếp các <B>Windows API về đồ hoạ (Graphics và Drawings)</B> như trong 
    VB6 nữa.<BR><BR>Nhu cầu có những áp dụng phía khách (client-based 
    application) phong phú (rich), linh động (flexible) và nhanh chóng 
    (responsive) sẽ vẫn còn đó. Hiện nay, để tránh phí tổn về cài đặt 
    (deployment) các chương trình, người ta bắt đầu có khuynh hướng đặt các 
    chương trình chạy trên Webserver, rồi cho user sử dụng chúng qua WebBrowser. 
    Ngoài công chúng thì dùng Internet, trong hãng xưởng thì dùng Intranet 
    (Intranet là Internet chạy trên Local Area Network - mạng địa phương, không 
    liên lạc gì với bên ngoài), tuy nhiên giao diện trên Web không phong phú hay 
    nhanh như trên desktop và dĩ nhiên công tác lập trình đòi hỏi một thời gian 
    phát triển lâu hơn.<BR><BR>Vì .NET Framework chứa đầy đủ mọi thư viện cần 
    thiết cho chương trình, nên một khi đã cài đặt .NET Framework trên máy khách 
    rồi ta chỉ cần <B>XCopy</B> đến đó những folders cần thiết có chứa các tệp 
    (files) chương trình và dữ kiện là đủ. Thực hiện việc nầy trên mạng địa 
    phương (Local Area Network) rất dễ và nhanh, thậm chí ta có thể tự động hóa 
    công tác copy nầy. <BR><BR>Trong mô hình lập trình nhiều tầng (<B>multi-tier 
    programming model</B>) mà ta gọi là <B>Windows DNA (Distributed Network 
    Application)</B>, quá trình xử lý một công tác được chia ra làm nhiều giai 
    đoạn như:</FONT></P>
    <OL>
      <LI>
      <P align=justify><FONT size=2>Kiểm chứng các con số user mới điền vào các 
      forms tại máy khách (<B>user interface</B>) </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Tính toán (<B>business logic</B>) 
</FONT></P>
      <LI>
      <P align=justify><FONT size=2>Truy cập cơ sở dữ liệu (<B>database 
      access</B>) </FONT></P></LI></OL>
    <P align=justify><FONT size=2>Và mỗi giai đoạn nói trên có thể nằm trên một 
    computer khác nhau. Nếu dùng Internet thì giai đoạn <B>1</B> nói trên sẽ 
    chạy trong WebBrowser bằng trang Web có chứa JavaScript routines để kiểm 
    chứng các con số user mới đánh vào. Còn các giai đoạn kia có thể chạy trên 
    WebServer. Dĩ nhiên giai đoạn <B>3</B> phải chạy trên WebServer, nơi chứa cơ 
    sở dữ kiện.<BR><BR>.NET cho phép ta lập trình giai đoạn 1 để chạy trong 
    Windows Forms. Còn các giai đoạn kia có thể để y nguyên. <BR><BR>Như thế, 
    giả dụ như ta có một hệ thống đặt hàng, ta có thể cho các telephone 
    operators dùng desktop (Winforms) application với một giao diện được tối ưu 
    hóa, chạy thật nhanh để phục vụ những người đặt hàng bằng điện thoại. Trong 
    khi đó khách hàng cũng có thể đặt hàng qua Internet WebBrowser như bình 
    thường. Cả hai nhóm users nầy dù có giao diện khác nhau nhưng đều xài chung 
    các tầng business logic và database access.<BR><BR>Đây là một ưu điểm rất 
    quan trọng của .NET mà ít ai chú ý. Nếu thiết kế khéo, ta có thể lập trình 
    để dùng chung hầu hết phần mềm trên desktop, distributed (phân tán), 
    Internet và Mobile (Mobile phone, Pocket-PC). </FONT></P>
    <H3 align=justify><FONT color=green size=2>Những điểm căn bản của Windows 
    Forms ?</FONT></H3>
    <P align=justify><FONT size=2>Trong các bài học và thí dụ trước đây ta đã 
    nói qua, bây giờ ta tóm tắc những điểm căn bản của Windows Forms:</FONT></P>
    <UL>
      <LI>
      <P align=justify><FONT size=2>Một Windows Form thật sự là một 
      <B>class</B>. Trong .NET không có từ đặc biệt như "form module" để dùng 
      cho nó. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Vì một form là một class nên ta không thể 
      load nó mà không nói thẳng thừng ra. Tức là trong VB6 nếu ta Show hay dùng 
      đến một Form thì nó tự động được loaded. Chẳng những thế thôi, cái 
      <B>class Form2</B> được dùng như một <B>variable Form2</B> luôn, tức là by 
      default ta có một Object tên Form2. Trong .NET ta phải khai báo (declare) 
      một variable tên myForm2 chẳng hạn rồi instantiate form ấy như một Object 
      của Form2 trước khi dùng nó. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Tất cả mọi form đều thừa kế từ <B>class 
      System.Windows.Forms.Form</B>. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Giống như tất cả các classes trong .NET 
      Framework, Windows Forms có constructors và destructors. Constructor của 
      form tên là <B>Sub New</B>, đại khái giống như Sub Form_Load trong VB6. 
      Destructor của form tên là <B>Sub Dispose</B>, đại khái giống như Sub 
      Form_Unload trong VB6. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Cái visual forms designer của VS.NET nhét 
      rất nhiều code để instantiate form và đặt các controls vào form. Đó là 
      code mà đáng lẽ ta phải tự viết nếu ta dùng notepad để lập trình. Phần 
      code nầy thay thế cái phần nằm ở đầu tệp .frm của VB6 để diễn tả các 
      visual components của form. Mỗi lần ta thêm bớt các controls hay thay thế 
      các properties của controls trên form thì code generated cho form được 
      thay đổi theo. Do đó bạn nên tránh sửa đổi code ấy, trừ khi biết chắc mình 
      đang làm gì, hay là bạn làm một phiên bản trước khi thay đổi để nếu lỡ kẹt 
      thì restore code cũ. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Event được xử lý bằng cách linh động hơn. 
      Các events chứa nhiều tin tức hơn. Một Event có thể được xử lý bởi nhiều 
      controls cùng một lúc và mỗi control có một cách xử lý khác nhau. Ngược 
      lại, nhiều Events khác nhau có thể được xử lý bằng một Event Handler duy 
      nhất. </FONT></P></LI></UL>
    <P align=justify><FONT size=2>Bạn tạo một chương trình Windows Forms bằng 
    cách dùng IDE menu command <B>File | New | Project..</B> để hiển thị giao 
    thoại New Project và chọn <B>Template Windows Application</B>. </FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=371 
      src="8_files/NewProjectApp.gif" width=531></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Trong thí dụ nầy, khi bạn click nút OK thì một 
    subfolder tên (Name:) <B>WindowsApplication4</B> sẽ được tạo ra trong folder 
    (Location:) <B>E:\NET\HongDevelopment\LessonPreparation</B> để chứa các tệp 
    của Project. Sau nầy, khi bạn build, tức là compile chương trình, thì kết 
    quả sẽ là một tệp <B>.exe</B> chứa trong folder 
    <B>E:\NET\HongDevelopment\LessonPreparation\WindowsApplication4\bin</B>.<BR><BR>Dĩ 
    nhiên trước khi click nút OK bạn có thể sửa <B>Name:</B> hay 
    <B>Location:</B> tùy ý. Ngoài ra, vì bạn chọn Windows Application, nên 
    project của bạn tự động có reference đến .NET component 
    <B>System.Windows.Forms.dll</B>.<BR><BR>Để xem lướt qua namespace 
    System.Windows.Forms, bạn hãy thử xúc tiến tạo cái project 
    WindowApplication4 nầy. Kế đó bạn chạy <B>Object Browser</B> bằng cách click 
    hình tam giác nhỏ của <B>Class View</B> icon rồi chọn Object 
    Browser:</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=334 
      src="8_files/ObjectBrowser.gif" width=298></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Trong Object Browser, expand cái 
    System.Windows.Forms tree để xem những types được định nghĩa bên trong và 
    các class members của Form:</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=551 src="8_files/BrowseForm.gif" 
      width=699></FONT></P></BLOCKQUOTE>
    <H3 align=justify><FONT color=green size=2>Kiến trúc (Architecture) của 
    Windows Forms ?</FONT></H3>
    <P align=justify><FONT size=2>Nếu bạn xem gia phả của form, bạn sẽ thấy tổ 
    phụ (đời thứ nhất) nó là <B>class Object</B>, còn form là con cháu đời thứ 
    bảy. Dưới đây là cái cây của gia phả form và một ít chú thích:</FONT></P>
    <TABLE cellSpacing=5 cellPadding=5 border=2>
      <TBODY>
      <TR>
        <TD align=middle>
          <P align=justify><B><FONT color=blue size=2>Thứ bậc các 
          classes</FONT></B></P></TD>
        <TD align=middle>
          <P align=justify><B><FONT color=blue size=2>Chú 
      thích</FONT></B></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Object</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Ông tổ trong .NET, superclass cao nhất 
          từ đó sanh ra con cháu.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
          size=2>&nbsp;&nbsp;&nbsp;&nbsp;MarshalByRefObject</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cung cấp các code cần thiết để quản lý 
          cuộc đời của objects.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
          size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cung cấp sự gầy dựng căn bản của 
          IComponent interface và cho phép các chương trình khác nhau dùng chung 
          một object </FONT></P>
      <TR>
        <TD>
          <P align=justify><B><FONT 
          size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Control</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Đây là base class của mọi component dùng 
          để hiển thị. Nó hỗ trợ những khả năng liên hệ đến vóc dáng và công tác 
          hiển thị từ Show, BringtoFront, Font, Color cho đến Dock, Anchor. 
          Ngoài ra nó còn cung cấp các Events của keyboard, mouse và có 
          <B>method WndProc</B> để cho ta truy cập các thông điệp của 
          Windows.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
          size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScrollableControl</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cung cấp chức năng tự động cuốn khi có 
          chứa bên trong một control cần thêm chỗ để hiển thị.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
          size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContainerControl</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cho phép một component chứa các controls 
          khác.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
          size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Form</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cửa sổ chính của một chương 
          trình.</FONT></P></TD></TR></TBODY></TABLE>
    <H3 align=justify><FONT color=green size=2>Các chức năng mới của Windows 
    Forms</FONT></H3>
    <H3 align=justify><FONT color=blue size=2>Những Controls tàn hình được chứa 
    riêng</FONT></H3>
    <P align=justify><FONT size=2>Một thay đổi rất tốt trong .NET từ VB6 là 
    những controls không hiển thị lúc chạy thì khi thiết kế chúng được chứa 
    trong một cái mâm riêng phía dưới. Thí dụ như trong hình dưới đây ta có 
    Timer, Tooltip, Menus và các Dialogs được cho nằm trong một component 
    Tray.<BR><BR><IMG height=527 src="8_files/ComponentTray.gif" width=911> Muốn 
    thay đổi properties của Control nào, ta chỉ cần chọn nó rồi right click và 
    chọn <B>Properties</B>. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Chọn Startup Form</FONT></H3>
    <P align=justify><FONT size=2>Để chỉ định StartUp Form của chương trình, bạn 
    cần phải mở cửa sổ Properties của Project để đánh vào <B>Startup Object</B>. 
    Bạn có thể làm điều ấy bằng cách dùng IDE menu command <B>Project | 
    Properties</B> hay right click tên của Project trong Solution Explorer rồi 
    chọn <B>Properties</B>. <BR><BR><IMG height=432 src="8_files/StartUp.gif" 
    width=664> </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Vị trí ban đầu</FONT></H3>
    <P align=justify><FONT size=2>Nhiều lúc ta muốn form hiện ra ngay giữa màn 
    ảnh khi chương trình khởi động. VB.NET có thể làm việc ấy tự động nếu bạn 
    set <B>property StartPosition</B> của nó thành <B>CenterScreen</B>. Các vị 
    trí khởi đầu bạn có thể set được liệt kê dưới đây:</FONT></P>
    <TABLE cellSpacing=5 cellPadding=5 border=2>
      <TBODY>
      <TR>
        <TD align=middle>
          <P align=justify><B><FONT color=blue size=2>Trị số Vị trí khởi 
          đầu</FONT></B></P></TD>
        <TD align=middle>
          <P align=justify><B><FONT color=blue size=2>Kết 
      quả</FONT></B></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Manual</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Hiển thị form ở vị trí theo giá trị của 
          <B>property Location</B> của form</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>CenterScreen</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Hiển thị form ở ngay giữa màn 
          ảnh</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>CenterParent</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Hiển thị form ở ngay giữa form chủ 
          (owner) của nó</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
        size=2>WindowsDefaultLocation</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Hiển thị form ở vị trí default của cửa 
          sổ</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT 
size=2>WindowsDefaultBounds</FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Hiển thị form ở vị trí default của cửa 
          sổ, với kích thước default của cửa sổ</FONT></P></TD></TR></TBODY></TABLE>
    <H3 align=justify><FONT color=blue size=2>Borders của Form</FONT></H3>
    <P align=justify><FONT size=2>Thay đổi <B>property FormBorderStyle</B> sẽ 
    ảnh hưởng những gì user có thể thay đổi hay dùng về MaximizeBox, 
    MinimizeBox, SizeGripStyle (mấy cái gạch chéo ở góc dưới phải của cửa sổ) và 
    HelpButton. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Luôn luôn nằm trên hết</FONT></H3>
    <P align=justify><FONT size=2>Một số chương trình có khả năng luôn luôn nằm 
    trên hết, ngay cả khi nó không có focus. Để thực hiện điều nầy trong VB6 ta 
    phải gọi API. Trong VB.NET, forms có một property mới tên là <B>TopMost</B>. 
    Chỉ cần set TopMost của một form thành True thì nó luôn luôn nằm trên hết. 
    </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Owned Forms (Forms có 
    chủ)</FONT></H3>
    <P align=justify><FONT size=2>Khi một form có chủ, nó được minimized và 
    closed theo form chủ của nó. Owned forms, đôi khi còn được gọi là forms nô 
    lệ, luôn luôn nằm lên trên form chủ của nó. Dầu vậy, nó không cản trở form 
    chủ nhận focus.<BR><BR>Ta dùng <B>method AddOwnedForm</B> của form chủ để 
    cho thêm owned form vào collection of OwnedForms của nó như 
    sau:</FONT></P></FONT><FONT face=Tahoma>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3>
            <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Form1_Load( <FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> MyBase.Load 
   <FONT color=blue>Dim</FONT> myForm2 <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> Form2() 
   myForm2.Show() 
   Me.AddOwnedForm(myForm2) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT 
    face=Arial size=2>
    <P align=justify>Form chủ có thể truy cập collection của các forms nô lệ qua 
    property OwnedForms. Dưới đây là code để loop qua các forms nô lệ của một 
    form:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> BtnListOwnedForms_Click( <FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> BtnListOwnedForms.Click 
   <FONT color=blue>Dim</FONT> OwnedForm <FONT color=blue>As</FONT> Form 
   <FONT color=blue>For</FONT> <FONT color=blue>Each</FONT> OwnedForm <FONT color=blue>In</FONT> Me.OwnedForms 
      Console.Write(OwnedForm.Text) 
   <FONT color=blue>Next</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Form chủ có thể cắt bỏ (remove) một form nô lệ bằng cách 
    dùng <B>method RemoveOwnedForm</B> như: </P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3>
            <DIV align=justify><PRE><FONT face=Arial>   Me.RemoveOwnedForm(myForm2) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE><FONT 
    face=Arial>
    <P align=justify><FONT size=2>Khi một form không còn là nô lệ nữa, nó không 
    hẳn bị unloaded, chỉ trở thành một form tự do (không còn liên hệ với form 
    chủ nữa) thôi.<BR><BR>Chú ý sự khác biệt giữa form nô lệ và TopMost form là 
    form nô lệ chỉ nằm trên form chủ nó, trong khi TopMost form nằm trên tất cả 
    mọi forms khác. TopMost form cũng không bị minimized hay closed khi một form 
    nào khác của chương trình bị minimized hay closed. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Không phải mọi controls đều bị 
    khoá (locked)</FONT></H3>
    <P align=justify><FONT size=2>Trong Vb6, ta có option <B>Lock Controls</B> 
    trong Format menu. Khi ta chọn Option nầy cho một form, tất cả controls đều 
    bị khóa, ngay cả những controls mới được để vào mặt form sau nầy. 
    <BR><BR>Trong VB.NET, ta cũng có option Lock Control trong Format menu hay 
    khi ta right click một nhóm controls đã được chọn trên form. Nhưng thao tác 
    khóa nầy chỉ hiệu lực đối với các controls có sẵn trên form mà thôi. Một 
    control mới được đặt lên form sau đó sẽ không bị khóa. Điều nầy cho phép ta 
    khóa những controls đã được để đúng vị trí, rồi tiếp tục sắp đặt các 
    controls mới mà không ngại vô tình làm di chuyển vị trí các controls cũ. 
    </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Độ đậm (Opacity) của 
    Form</FONT></H3>
    <P align=justify><FONT size=2>Có một property mới của form rất thú vị để 
    dùng, dù rằng sự ích lợi hay mục đích của áp dụng không rõ ràng. Đó là ta có 
    thể thay đổi độ đậm của một form. Ta có thể làm cho nó trong suốt khi set 
    <B>property Opacity</B> của form bằng 0, hay cho nó mờ mờ như ma nếu trị số 
    của Opacity ít hơn 1. Bạn hãy thử đánh code dưới đây vào một form cho 
    Button1 chẳng hạn, rồi chạy chương trình và click Button1 
    ấy:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Button1_Click( <FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> Button1.Click 
   <FONT color=blue>Dim</FONT> i <FONT color=blue>As</FONT> <FONT color=blue>Double</FONT> 
   <FONT color=blue>For</FONT> i = 0 <FONT color=blue>To</FONT> 1 <FONT color=blue>Step</FONT> 0.01 
   <FONT color=green>'  Opacity có trị số từ 0 (trong suốt)  đến 1 (đậm đặt)</FONT>
      Me.Opacity = i 
   <FONT color=blue>Next</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>Form properties cho Cancel Button 
    và Default Button</FONT></H3>
    <P align=justify><FONT size=2>Trong VB6, ta có thể set một button để nó như 
    được clicked khi thật ra user bấm phím <B>Esc</B>. Ta thực hiện điều nầy 
    bằng cách set <B>property Cancel</B> của button ấy thành True. Nó được gọi 
    là <B>Cancel button</B>.<BR><BR>Tương tự như thế, nếu ta set <B>property 
    Default</B> của một button thành True, nó được gọi là <B>Default button</B>, 
    khi user bấm phím <B>Enter</B> Default button coi như được 
    clicked.<BR><BR>Trong VB.NET ta cũng có thể dùng các chức năng ấy, nhưng bây 
    giờ ta không đá động gì đến property nào của các buttons, mà lại set các 
    <B>properties CancelButton</B> và <B>AcceptButton</B> của chính form. 
    <BR><BR>Khi ta click bên phải của property AcceptButton trong cửa sổ 
    Properties thì danh sách các buttons có sẵn trên form được liệt kê ra để ta 
    chọn như dưới đây:</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=447 
      src="8_files/AcceptButton.gif" width=219></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Ngoài ra ta cũng có thể chọn các CancelButton 
    và AcceptButton lúc đang chạy chương trình, nhất là khi ta muốn bổ nhiệm các 
    công tác nầy cho những buttons khác vì form đang làm việc trong một trạng 
    thái khác như trong code thí dụ dưới đây:</FONT></P></FONT>
    <BLOCKQUOTE>
      <TABLE bgColor=#f6f6f6>
        <TBODY>
        <TR>
          <TD><FONT size=3>
            <DIV align=justify><PRE><FONT face=Arial>Me.CancelButton = BtnCancel2 
Me.AcceptButton = BtnAccept2 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE></BLOCKQUOTE></FONT><!-- Start of bottom bar for copyright notice etc -->
    <TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
    width="100%" border=0>
      <TBODY>
      <TR>
        <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
          <P align=justify><FONT face=Arial color=#ffffff size=2>Vovisoft © 
          2000. All rights reserved.</FONT></P></TD></TR>
      <TR>
        <TD width=256>
          <P align=justify><FONT face=Arial size=2>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->07 
          th3 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="13302" --> </FONT></P></TD>
        <TD width=181>
          <P align=justify><FONT face=Arial size=2></FONT>&nbsp;</P></TD>
        <TD width=258>
          <P align=justify><FONT face=Arial size=2><A 
          href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE></BLOCKQUOTE></BLOCKQUOTE>
<HR>

<P align=center><FONT face="Times New Roman"><B><FONT color=#ff0000>PcLeHoan 
1996 - 2002</FONT><FONT face=.VnTime size=2><BR></FONT></B></FONT><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.pclehoan.com/andi/ndc.htm">http://www.pclehoan.com/andi/ndc.htm</A><BR><B>Mirror 
</B>: <A 
href="http://www.lehoanpc.net/andi/ndc.htm">http://www.lehoanpc.net/andi/ndc.htm</A></FONT><BR><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.ktlehoan.com/">http://www.ktlehoan.com/</A></FONT></P>
<P align=center><A target=_top 
href="http://member.bcentral.com/cgi-bin/fc/fastcounter-login?2828564"><IMG 
src="8_files/digits.gif" border=0></A> </P></BODY></HTML>
